package main

import (
	"fmt"
	"reflect"
)

func main() {
	jython := Jython{3, "jython", 5}
	Info(jython)
}

type Jython struct {
	Id   int
	Name string
	Age  int
}

func (u Jython) Hello() {
	fmt.Println("hello,world")
}

func Info(o interface{}) {
	t := reflect.TypeOf(o)
	ll := Jython{}
	s := reflect.ValueOf(o).Type()
	fmt.Println(s)
	fmt.Println(reflect.Indirect(reflect.ValueOf(o)).Type())
	reflect.New(reflect.TypeOf(ll)).MethodByName("Hello").Call(nil)
	fmt.Println(t)
	fmt.Println(t.Name())
	fmt.Println(reflect.Indirect(reflect.ValueOf(o)))
	v := reflect.ValueOf(o)
	fmt.Println(v)
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		val := v.Field(i).Interface()
		fmt.Println(f.Name, f.Type, val)
	}
	for i := 0; i < t.NumMethod(); i++ {
		m := t.Method(i)
		fmt.Println(m.Name, m.Type)
	}
}
